home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / SYS / s / locale.wrx < prev    next >
Text File  |  1996-09-26  |  14KB  |  496 lines

  1. /* ARexx script to maintain MakeCat style locale C-code
  2.  *
  3.  * written 20/09/93
  4.  * © 1993 by MGR-Software, Asgard
  5.  * contact: mgr@asgard.bo.open.de
  6.  *
  7.  * Action codes are to be passed as parameters. The following codes*
  8.  * are supported:
  9.  *
  10.  *   CUTSTRING    - break up a constant string at the cursor position
  11.  *                  into two lines using the '\' C-directive
  12.  *
  13.  *   BREAKSTRING  - break up string to a maximum linelength of the
  14.  *                  current cursor position
  15.  *
  16.  *   CATSTRING    - place a multiline string into a single line. Note
  17.  *                  that you may not have trailing "\" in comments!
  18.  *                  Also not that comments get lost.
  19.  *
  20.  *   FIXSTRING    - recurse CATSTRING until the string is in a single line
  21.  *
  22.  *   LOCALIZE     - take a given string and create a LocText structure
  23.  *                  for it. Count IDs automatically, place the string
  24.  *                  at the right location or even file, etc.
  25.  *                  Note that the string must probably FIXSTRINGED first!
  26.  *
  27.  *   EDITTEXT     - find the LocText structure belonging to the ID under
  28.  *                  the cursor
  29.  *
  30.  *   RENUMBER     - renumber all catalog entries
  31.  *
  32.  * Installation:
  33.  *
  34.  *   Put the above actions on some keys or menus. Write your locale stuff
  35.  *   according to the MakeCat requirements, i.e:
  36.  *
  37.  *         struct LocText MSG_TEST={2,"This is a test!"};
  38.  *         (*
  39.  *            D "Das ist ein Test!"
  40.  *            F "Ça c'est un test!"
  41.  *         *)
  42.  *
  43.  *   where (*, *) denote comments that would confuse ARexx. All those
  44.  *   entries must be enclosed in a block started by
  45.  *
  46.  *         #define LOCALE_START
  47.  *         #define LOCALE_END
  48.  *
  49.  *   finishes that block. The file must also contain
  50.  *
  51.  *         #define LOCALE_INDEX 0
  52.  *
  53.  *   which holds the automatically maintained ID for the next catalog
  54.  *   entry. If it does not exist it will be automatically created and
  55.  *   set to 0. You may use "RENUMBER" to clean up.
  56.  *   You may place
  57.  *
  58.  *         $Localefile = myfile
  59.  *
  60.  *   e.g. inside a comment, into any file holding locale strings. This
  61.  *   script will automatically lookup into the file named there for the
  62.  *   catalog entries.
  63.  *   Finally you should define a macro called "Loc" anywhere you want.
  64.  *   The above example will be accessed by
  65.  *
  66.  *         test_string = Loc(MSG_TEST)
  67.  *
  68.  */
  69.  
  70. arg action
  71.  
  72. if ~show('P',"WRITE") then
  73. do
  74.   say "This script is useless without the WRITE editor!"
  75.   exit 0
  76. end
  77.  
  78. address 'WRITE'
  79. options results
  80.  
  81. 'VERSIONCHECK 3848 "Locale.wrx"'
  82. IF RC~=0 THEN DO
  83.   exit 10
  84. END
  85.  
  86. 'GetVar (_CurrentID)'
  87. ID = RESULT
  88. 'LockWindow' ID
  89.  
  90. select
  91.   when action = "CUTSTRING"     then call cutstring
  92.   when action = "CATSTRING"     then call catstring ext
  93.   when action = "BREAKSTRING"   then call breakstring
  94.   when action = "FIXSTRING"     then call fixstring
  95.   when action = "LOCALIZE"      then call localize
  96.   when action = "EDITTEXT"      then call edittext
  97.   when action = "RENUMBER"      then call renumber
  98.   otherwise 'MessageOK (Unbekannte Option:' action ')'
  99. end
  100.  
  101. 'LockWindow 0'
  102. exit 0
  103.  
  104. renumber: procedure
  105.  
  106.   'GETVAR (_XPos)'                             /* get home position */
  107.   a.x = RESULT
  108.   'GETVAR (_YPos)'
  109.   a.y = RESULT
  110.  
  111.   'Goto 1 1'                                   /* find locale part of program */
  112.   'SetVar (_PatCase) (# struct# LocText#?=# {#?)'
  113.   'SetVar (_FindString) ({)'
  114.   'GetVar (_WordDef)'
  115.   wdef = RESULT
  116.   'SetVar (_WordDef) 1'                        /* as cyphers are not alpha */
  117.   num = 0                                      /* IDs start with 0 */
  118.   'FindPattern @CURSOR @EOT {@SILENT}'
  119.   do while RC = 0
  120.      'Goto @SOL @SOL'
  121.      'Find @CURSOR @CURSOR @EOT @EOT {@SILENT}'
  122.      do until ((word ~= "") | (ret ~= 0))      /* find id in a word */
  123.         'CursorRight 0'
  124.         ret = RC
  125.         'GetVar (_CurrentWord)'
  126.         word = RESULT
  127.      end
  128.      if ret ~= 0 then
  129.      do
  130.         'MessageOK "Malformed LocText structure. Aborting ..."'
  131.         'SetVar (_WordDef)' wdef
  132.         return
  133.      end
  134.  
  135.      'CursorRight 0'                           /* find beginning of current word */
  136.      'LastWord'
  137.  
  138.      p=pos('{',word)                           /* get leading items */
  139.      if p ~= 0 then pre = left(word,p)
  140.      else pre = ""
  141.  
  142.      'DeleteWord'
  143.      'WriteText "'||pre num||'"'
  144.      num = num + 1
  145.      'CursorDown 0'
  146.      if RC = 0 then 'FindPattern @CURSOR @EOT {@SILENT}'
  147.   end
  148.  
  149.   'Goto 1 1'                                   /* set maximum catalog message number */
  150.   'SetVar (_FindString) (#define LOCALE_INDEX)'
  151.   'Find @CURSOR @CURSOR @EOT @EOT {@SILENT}'
  152.   if RC ~= 0 then
  153.   do
  154.      'Goto 1 1'
  155.      'WriteText (#define LOCALE_INDEX' num||')'
  156.      'Return'
  157.   end
  158.   else do
  159.      'DeleteLine'
  160.      'WriteText "#define LOCALE_INDEX' num || '"'
  161.      'Return'
  162.   end
  163.  
  164.   'SetVar (_WordDef)' wdef
  165.   'Goto' a.x a.y
  166.  
  167.   return
  168.  
  169.  
  170. edittext: procedure
  171.  
  172.   'GETVAR (_XPos)'                             /* get home position */
  173.   a.x = RESULT
  174.   'GETVAR (_YPos)'
  175.   a.y = RESULT
  176.  
  177.   'GetVar (_CurrentWord)'                       /* get ID */
  178.   topic = RESULT
  179.  
  180.   call gettextfile
  181.   if ret ~= 0 then return
  182.  
  183.   if (OldID ~= 0) then
  184.   do
  185.      'LockWindow' OldID                        /* leave the cursor untouched, if the */
  186.      'Goto' a.x a.y                            /* locals are in a different file     */
  187.      'LockWindow' ID
  188.   end
  189.  
  190.   'SetVar (_FindString) (struct LocText ' || topic || '=)'
  191.   'Find @CURSOR @CURSOR @EOT @EOT {@SILENT}'
  192.   if RC ~= 0 then
  193.   do
  194.      'MessageOK (Locale string "'|| topic ||'" not found!)'
  195.      if (OldID ~= 0) then 'QuitED'
  196.   end
  197.  
  198.   return
  199.  
  200. localize: procedure
  201.  
  202.   'GETVAR (_XPos)'                             /* get home position */
  203.   a.x = RESULT
  204.   'GETVAR (_YPos)'
  205.   a.y = RESULT
  206.  
  207.   'GetVar (_CurrentChar)'                       /* are we on a string */
  208.   ch = RESULT
  209.   if ch ~= '"' then
  210.   do
  211.      'MessageOK (Cannot localize constants!)'
  212.      return
  213.   end
  214.   'UnMark'                                     /* cut string to buffer 1 */
  215.   'SetMark'
  216.   old = '\'
  217.   do until ((ch = '"') & (old ~= '\'))
  218.      'CursorRight 1'
  219.      if RC ~= 0 then
  220.      do
  221.         "MessageOK (String isn't terminated)"
  222.         return
  223.      end
  224.      old = ch
  225.      'GetVar (_CurrentChar)'
  226.      ch = RESULT
  227.      if ch = "RESULT" then ch = " "
  228.   end
  229.   'SetMark'
  230.   'CopyBlock 1'
  231.   'DeleteBlock'
  232.   'Goto' a.x a.y                               /* and insert Loc(MSG_?) instead */
  233.   'GetString (Locale structure name:) (MSG_)'
  234.   if RC ~= 0 then name = "MSG_?"
  235.   else name = RESULT
  236.   'WriteText "Loc('||name||')"'
  237.  
  238.   call gettextfile                             /* open the file containing locals */
  239.   if ret ~= 0 then return
  240.  
  241.   if (OldID ~= 0) then
  242.   do
  243.      'LockWindow' OldID                        /* leave the cursor untouched, if the */
  244.      'Goto' a.x a.y                            /* locals are in a different file     */
  245.      'LockWindow' ID
  246.   end
  247.  
  248.   'Goto 1 1'                                   /* get maximum catalog message number */
  249.   'SetVar (_FindString) (#define LOCALE_INDEX)'
  250.   'Find @CURSOR @CURSOR @EOT @EOT {@SILENT}'
  251.   if RC ~= 0 then
  252.   do
  253.      'Goto 1 1'
  254.      'WriteText (#define LOCALE_INDEX 1)'
  255.      'Return'
  256.      idx = 0
  257.   end
  258.   else do
  259.      'GetVar (_CurrentLine)'                    /* increment and replace msg num */
  260.      line = RESULT
  261.      idx = word(line,3)
  262.      'DeleteLine'
  263.      'WriteText "#define LOCALE_INDEX' idx+1 || '"'
  264.      'Return'
  265.   end
  266.   'Goto 1 1'                                   /* add msg to end of locale block */
  267.   'SetVar (_FindString) (#define LOCALE_END)'
  268.   'Find @CURSOR @CURSOR @EOT @EOT {@SILENT}'
  269.   'Goto @SOL @SOL'
  270.   'Return'
  271.   'CursorUp 0'
  272.   'WriteText "struct LocText' name||'={'||idx||',"'
  273.   'InsertBlock 1'
  274.   'Goto @EOL @EOL'
  275.   'WriteText "};"'
  276.   'Return'
  277.   'WriteText "/*"'
  278.   'Return'
  279.   'WriteText "*/"'
  280.   'Return'
  281. return
  282.  
  283. gettextfile: procedure EXPOSE ID OldID ret
  284.  
  285.   'Goto 1 1'                                   /* find locale tag */
  286.   'SetVar (_FindString) ($Localefile)'
  287.   'Find @CURSOR @CURSOR @EOT @EOT {@SILENT}'
  288.   if RC = 0 then
  289.   do
  290.      'GetVar (_CurrentLine)'                    /* parse it */
  291.      line = RESULT
  292.      line = substr(line,pos("$Localefile",line))
  293.      line = delword(line,1,1)
  294.      do i=1 until cnt = 0
  295.         ch = substr(line,i,1)
  296.         if ((ch = ':') | (ch = '=') | (ch = ' ')) then cnt = 1
  297.         else cnt = 0
  298.      end
  299.      line = substr(line,i)
  300.      line = word(line,1)
  301.  
  302.      sfil = reverse(line)                      /* isolate filename */
  303.      i = pos('/',sfil)                         /* to compare with _File */
  304.      if i ~= 0 then sfil = left(sfil,i-1)      /* variable */
  305.      i = pos(':',sfil)
  306.      if i ~= 0 then sfil = left(sfil,i-1)
  307.      sfil = reverse(sfil)
  308.  
  309.      'GetVar (_CurrentID)'                     /* store ID */
  310.      OldID = RESULT
  311.  
  312.      LockWindow 0                              /* we must of course unlock */
  313.      'NextED 0'                                /* file already loaded ? */
  314.      file = ""
  315.      do while ((RC = 0) & (file ~= sfil))
  316.        'GetVar (_CurrentID)'
  317.        ID = RESULT
  318.        'GetVar (_File)'
  319.        file = RESULT
  320.        NextED ID
  321.      end
  322.  
  323.      if file = sfil then
  324.      do
  325.        LockWindow ID                           /* lock and activate window */
  326.        'Goto 1 1'
  327.        'GetVar (_WinMode)'
  328.        if ((RESULT = 1) | (RESULT = 2)) then 'Window 0 0 0 0'
  329.      end
  330.      else do
  331.         LockWindow OldID                       /* if not: get path and open */
  332.         'GetVar (_FILEPATH)'
  333.         path = RESULT
  334.         if right(path,1,':') ~= ':' then path = path || '/'
  335.  
  336.         if ~exists(line) then                  /* check file existance */
  337.         do
  338.            if ~exists(path||line) then
  339.            do
  340.               'MessageOK "Could not open localefile:' line '"'
  341.               ret = 10
  342.               return
  343.            end
  344.            line = path||line
  345.         end
  346.  
  347.         'NewEd ""'                             /* open the tagged file */
  348.         ID = RESULT
  349.         'LockWindow' ID
  350.         'Open "'||line||'"'
  351.         'Window 300 14 0 300'
  352.      end
  353.   end
  354.   else OldID = 0                               /* code: SAME_FILE */
  355.  
  356.   ret = 0
  357.   return
  358.  
  359. fixstring: procedure EXPOSE ret
  360.  
  361.   do until ret ~= 0
  362.      call catstring int
  363.   end
  364.   'Goto 1 _YPos'
  365.   return
  366.  
  367. breakstring: procedure
  368.  
  369.   'GetVar (_XPos)'              /* home position */
  370.   max = RESULT
  371.   'GetVar (_YPos)'
  372.   y.o = RESULT
  373.   y.c = y.o
  374.  
  375.   do forever
  376.      'SetRexxClip (WRITELineClip) 0 _YPos'     /* seek spaces and '\n' in line to break there */
  377.      line = getclip('WRITELineClip')
  378.      p = pos("\n",line)
  379.      if ((p ~= 0) & (p ~> max)) then w.o=p+2   /* break behind '\n' */
  380.      else if (length(line) > max) then
  381.      do
  382.         w.c = 0
  383.         w.o = 0
  384.         do i=2 while w.c ~> max                /* find words fitting in line */
  385.            w.o = w.c
  386.            w.c = wordindex(line,i)
  387.         end
  388.         if (w.o = 0) then w.o = w.c            /* overfull hbox penalty ... */
  389.      end
  390.      else w.o=0
  391.  
  392.      if (w.o = 0) then                         /* somethings wiered */
  393.      do
  394.         'Goto' max y.o
  395.         return 0
  396.      end
  397.  
  398.      line = strip(right(line,w.o))             /* does the string continue ? */
  399.      if substr(line,1,1) ~= '"' then
  400.      do
  401.         'Goto' w.o y.c                         /* cut it and recurse next line */
  402.         call cutstring
  403.         y.c = y.c + 1
  404.      end
  405.      else do
  406.         'Goto' max y.o                         /* DONE */
  407.         return 0
  408.      end
  409.   end
  410.   return 0
  411.  
  412. cutstring: procedure
  413.  
  414.   'GETVAR (_XPos)'                             /* get home position */
  415.   a.x = RESULT
  416.   'GETVAR (_YPos)'
  417.   a.y = RESULT
  418.  
  419.   'GetVar (_CurrentLine)'                       /* seek '"' for autoindent position */
  420.   line = RESULT
  421.   b.x = pos('"',line)
  422.   if b.x = 0 then                              /* cannot format def'd strings !*/
  423.   do
  424.      'MessageOK "Sorry, but this line does not hold any string!"'
  425.      return 0
  426.   end
  427.  
  428.   line = substr(line,a.x)                      /* get leading spaces, because */
  429.   spc = wordindex(line,1)-1                    /* "RETURN" will kill them !   */
  430.  
  431.   'WriteText ("\)'                             /* cut string */
  432.   'Return'
  433.   'GETVAR (_XPOS)'
  434.   b.c = RESULT
  435.   b.d = b.x - b.c
  436.   if b.d > 0 then                              /* autoindent */
  437.   do
  438.      line = copies(' ',b.d)
  439.      'WriteText "'||line||'"'
  440.   end
  441.   'WriteChar 34'                               /* begin next '"' */
  442.   if spc > 0 then
  443.   do
  444.      line = copies(' ',spc)                    /* restore killed spaces */
  445.      'WriteText "'||line||'"'
  446.   end
  447.  
  448. return 0
  449.  
  450. catstring: procedure EXPOSE ret
  451.  
  452.   arg mode
  453.  
  454.   'SetRexxClip (WRITELineClip) 0 _YPos'
  455.   line = getclip('WRITELineClip')
  456.   line = strip(line,'T')
  457.   if right(line,1) = "\" then 'Goto' length(line) '_YPos'
  458.   else
  459.   do
  460.      p = pos("\ ",line)
  461.      if p = 0 then
  462.      do
  463.         if mode = "EXT" then 'MessageOK "Sorry, but this line does not hold a broken string!"'
  464.         ret = 5
  465.         return
  466.      end
  467.      'Goto' p '_YPos'
  468.   end
  469.  
  470.   'DELETE'                                     /* kill cat operator */
  471.   ch = ' '
  472.   do while ch = ' '                            /* find last real symbol */
  473.      'CursorLeft 0'
  474.      if RC ~= 0 then
  475.      do
  476.         'MessageOK "Sorry, but this line does not hold a broken string!\nNote that the line has been changed."'
  477.         ret = RC
  478.         return
  479.      end
  480.      'GETVAR (_CurrentChar)'
  481.      ch = RESULT
  482.      if ch = "RESULT" then ch = " "
  483.   end
  484.   if ch ~= '"' then 'CursorRight 0'
  485.   'DeleteToEOL'                                /* kill overhead */
  486.   do until ch ~= ' '                           /* and autoindent spaces */
  487.      'Delete'
  488.      'GetVar (_CurrentChar)'
  489.      ch = RESULT
  490.   end
  491.   if ch = '"' then 'DELETE'                    /* and of course the '"' */
  492.  
  493.   ret = 0
  494.   return
  495.  
  496.